package com.lyy.service;

import com.lyy.entity.User;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Select;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * @author Liangyaoyun
 */
public interface UserService {
    /**
     * 注册一条用户记录
     *
     * @param user 添加字段: 其中 昵称/头像/性别/年龄/删除状态//创建日期/修改日期 字段传递无效
     * @return 成功时返回新用户记录，失败时抛异常
     */
    User register(User user);

    /**
     * 按账号密码登录
     *
     * @param username 登录账号
     * @param password 登录密码
     * @return 成功时返回用户记录，失败时抛异常
     */
    User loginByAccount(String username, String password);

    /*按手机号登录*/
    User loginByPhone(String vcode,String phone);

    /*
    * 按手机号码和验证码登录
    * @param vcode 4位随机验证码
    * @param phone 手机号
    * @return 登录失败返回null，登录成功返回user实体
    * /
    String generateVcode(String phone);
    /**
     * 按手机号码查询一条用户记录
     *
     * @param phone 手机号
     * @return 成功时返回用户记录，失败时抛异常
     */
    User selectByPhone(String phone);

    String generateVcode(String phone);

    /**
     * 按用户表主键查询一条用户记录
     *
     * @param userId 用户表主键
     * @return 成功时返回用户记录，失败时抛异常
     */
    User selectByUserId(Integer userId);

    /**
     * 按用户表主键修改一条用户记录
     *
     * @param user   修改字段: 其中 用户主键/用户账号/创建日期/修改日期 字段传递无效
     * @param userId 用户表主键
     */
    void updateByUserId(User user, Integer userId);

    /**
     * 按用户表主键修改用户密码
     *
     * @param userId      用户表主键
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     */
    void updatePassword(Integer userId, String oldPassword, String newPassword);

    /**
     * 按用户表主键删除一条用户记录（假删）
     *
     * @param userId 用户表主键
     */
    void deleteByUserId(Integer userId);

    /**
     * 上传用户头像文件
     *
     * @param avatarFile 用户头像文件
     * @param userId     用户主键
     */
    void uploadAvatar(MultipartFile avatarFile, Integer userId);

    /**
     *
     * @param  userId 用户主键
     * @return 用户积分
     */
    Double selectPoints(Integer userId);
}
